package com.easyim.imclient.handler;

import com.alibaba.fastjson2.JSONObject;
import com.easyim.common.message.Immessage;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ImClientHandler extends SimpleChannelInboundHandler<Immessage.ImMessage> {
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Immessage.ImMessage imMessage) throws Exception {
        //在这里放一个持有期。交给spring管理 这样子 rest方便管理了
        if (imMessage.hasCmdMessage()) {
            //处理服务器端的命令
            log.info("reviser cmd from server:{}", JSONObject.toJSONString(imMessage.getCmdMessage()));
        }
        if (imMessage.hasDataMessage()) {
            Immessage.DataMessage dataMessage = imMessage.getDataMessage();
            //有人发消息了 接收消息进行显示
            log.info("reviser user msg from server:{}", JSONObject.toJSONString(imMessage.getDataMessage()));
            //返回服务器端一个ack 告诉服务器 我们读到哪条消息了
            //如果先投递的消息 ack后面才回到服务器 那么服务器需要比较一下 我们维护一个每个用户 每个端 读取到了哪里的游标 这样子不同的端 可以拉取不同的消息
            Immessage.ImMessage.Builder builder = Immessage.ImMessage.newBuilder().setAckMessage(
                    Immessage.AckMessage.newBuilder().setServerMsgId(dataMessage.getServerMsgId())
                            .setSessionId(dataMessage.getSessionId())
                            .setStatus(true).build());
            Immessage.ImMessage ack = builder.build();
            //发送ack 告诉服务器自己收到了 并且展示或者做逻辑处
            channelHandlerContext.channel().writeAndFlush(ack);
        }
        if(imMessage.hasAckMessage()){
            //服务器发来ack 说明收到了 服务器会保存 那么端上就可以认为发送成功 至于已读未读.
        }
    }

}
